package book;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class tcp_book {
    ServerSocket serverSocket;
    ExecutorService pool;
    int port;

    public tcp_book(int port) {
        this.port = port;

        //建立一个线程池
        pool = Executors.newCachedThreadPool();

        try {
            //负责建立和储存连接
            serverSocket = new ServerSocket(port);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }


    void start() {
        System.out.println("成功启动");
        while(true) {
            try {
                //获取到建立好的连接，并使用socket来对这个连接进行操作
                Socket socket = serverSocket.accept();

                //创建线程来处理这个请求
                pool.submit(() -> {
                    try {
                        System.out.println("成功连接" + socket.getPort());
                        mainlogic(socket);
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                });
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

    // 对这个联机的具体操作
    private void mainlogic(Socket socket) throws IOException {
        //tcp是有连接的协议，我们可以通过InputStream和OutputStream获得这个连接
        //读取接收缓冲区中的数据
        InputStream in = socket.getInputStream();
        //写入数据到发送缓冲区中
        OutputStream out = socket.getOutputStream();

        // 接收到发送来的数据 read()将数据写入到byte中，返回读到的数据
        try {
            while (true) {

                byte[] buf = new byte[1024];
                int len = in.read(buf);

                // 现在对数据进行操作，这里我就直接返回数据了
                // 将数据写到发送缓冲区中 从0位置写len个数据
                out.write(buf, 0, len);

                // 现在还没有将数据真正的发送，需要刷新缓冲区才会发送出去
                out.flush();

                System.out.println(socket.getInetAddress() + ": " + "数据已发送");
            }
        } catch (IOException e) {
            System.out.println("连接断开");
        }finally {
            out.close();
            in.close();
        }
    }

    public static void main(String[] args) {
        tcp_book t = new tcp_book(9990);
        t.start();
    }
}

